package com.qf;

import com.qf.interfaces.FangDongService;
import com.qf.staticProxy.FangDongServiceImpl;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.InvocationHandler;

import java.lang.reflect.Method;

/*
JDK代理由JDK自带，不需要引入第三方依赖 必须有接口才可以代理 真实对象和代理对象实现了相同接口
cglib动态代理 需要引入第三方依赖  没有接口也可以代理 代理对象是真实对象的子类对象
 */
public class CglibDynamicProxy {
    public static void main(String[] args) {
        //真实对象
        FangDongService fangDongService = new FangDongServiceImpl();
        //创建 创建增强对象的对象
        Enhancer enhancer = new Enhancer();
        //设置父类对象
        enhancer.setSuperclass(fangDongService.getClass());
        //设置增强部分
        enhancer.setCallback(new InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                //添加辅助功能
                System.out.println("发布租房信息");
                System.out.println("带租户看房");
                //调用真实对象的方法
                //通过反射执行真实方法
                //参数一：真实对象
                //参数二：方法的参数
                //返回值：真实对象的返回值,如果方法为void，自动返回null
                Object result = method.invoke(fangDongService, objects );
                //添加辅助功能
                System.out.println("维护房屋");
                System.out.println("打扫卫生");
                return result;
            }
        });
        //创建代理对象
        FangDongService proxy = (FangDongService) enhancer.create();
        proxy.zufang();
    }
}
